extends ScrollContainer

#примитив репрезентации категории в виде списка.
#предназначен для использования в других примитивах более высокого уровня
#основной кейс использования - инстанцирование с назначением идентификатора
#представляемой категории и отлавливание сигнала о раскрытии/закрытии подкатегорий
# планируется не совсем целевое использование, так как в конце списка будут
# представлены уже не категории а конечные чертежи.

#примитив категорийной кнопки
var category_btn = preload("res://categoty_btn/category_btn.tscn")
#ссылка на текущий объект
@onready var cat_list = $HBoxContainer

#идентификатор категории, репрезентацией которой является этот список
#короче говоря, к какой категории относится эта
var this_list_category_id : int = -1

var opened_subcategory : int = -1 : set = _set_opened_subcategory
func  _set_opened_subcategory(new_val : int):
	opened_subcategory = new_val
	if (new_val == -1):
		for btn in cat_list.get_children():
			if btn.is_current:
#мы не хотим, чтобы он кричал о закрытии категории, мы об этом знаем
#поэтому на момент закрытия категории замьютим его
				btn.close_category.disconnect(_close_category_by_id)
				btn.is_current = false
				btn.close_category.connect(_close_category_by_id)
	print("DEBB:: this_list_category_id: ", this_list_category_id, 
		" opened_subcategory: ", opened_subcategory)

#интерфейсный сигнал, сообщающий идентификатор следующей категории которую нужно раскрыть 
signal open_subcategoriy(category_id: int)
#интерфейсный сигнал, сообщающий закрыть подкатегории этой категории 
signal close_subcategoriy(category_id: int)
#интерфейсный сигнал, сообщающий переоткрыть подкатегорию 
signal reopen_subcategoriy(old_subcategory_id: int, new_subcategory_id: int)

# Called when the node enters the scene tree for the first time.
func _ready():
	update()

func update():
	var categories_list : Array = DbAdapter.get_categories_list_by_id(this_list_category_id)
	print("DEBB:: categories: ",  categories_list)
	for category in categories_list:
		var cat_btn : Button = category_btn.instantiate()
		cat_btn.text = str(category["alias"])
		cat_btn.id = str(category["id"])
		cat_btn.open_category.connect(_open_category_by_id)
		cat_btn.close_category.connect(_close_category_by_id)
		cat_list.add_child(cat_btn)

#Проверим, есть ли открытые подкатегории и если есть, то вместо сигнала открытия
#отправим сигнал переоткрытия
читай комментарий
#сюда приходит идентификатор этой же категории, нужно поставить проверку,
#есть ли у неё дети, чтобы не открывать те, у которых "нет детей"
func _open_category_by_id(id:int):
#категория 
	var is_have_children : bool = false
	print("DEBB:: _open_category_by_id: ", id)
	if has_opened_subcategory():
		reopen_subcategoriy.emit(opened_subcategory, id)
	else:
		open_subcategoriy.emit(id)
	opened_subcategory = id

func _close_category_by_id(id:int):
	close_subcategoriy.emit(id)
	opened_subcategory = -1

func has_opened_subcategory() -> bool:
	return not opened_subcategory == -1
